package top.humbleyuan.designmode.proxy.dynamic.cglib_proxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @Author HumbleYuan
 * @Date 2020/3/22 20:12
 * @Des
 */
public class client {
    public static void main(String[] args) {
        // cglib
        Hero eich = new ADC();

        Hero cglibProducer = (Hero) Enhancer.create(eich.getClass(), new MethodInterceptor() {

            /**
             * 执行被代理对象的任何方法都会经过该方法，过滤
             * @param o
             * @param method
             * @param objects
             * 以上三个参数和基于接口的动态代理的invoke方法的参数一样
             * @param methodProxy ： 当前执行方法的代理对象
             * @return
             * @throws Throwable
             */
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                Object newMethodInvoke = null;

                // 此处模拟代理商在销售时收取额外费用，导致生产者利润减少
                if ("desc".equals(method.getName())) {
                    newMethodInvoke = method.invoke(eich);
                    System.out.println("没有位移");
                    return newMethodInvoke;
                }

                if ("character".equals(method.getName())) {
                    System.out.println("普攻减速");
                    return method.invoke(eich);
                }

                return method.invoke(eich, objects);
            }
        });

        eich.desc();
        eich.character();
    }
}
